<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>查询字符串(query_string)查询 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'query-dsl-query-string-query.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-query-string-query.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-query-string-query.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/query-dsl-query-string-query.html" rel="nofollow" target="_blank">../en/query-dsl-query-string-query.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">查询领域特定语言(Query DSL)</a></span>
»
<span class="breadcrumb-link"><a href="full-text-queries.html">全文查询</a></span>
»
<span class="breadcrumb-node">查询字符串(query_string)查询</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl-common-terms-query.html">« 常用(common)词项查询</a>
</span>
<span class="next">
<a href="query-dsl-simple-query-string-query.html">简单查询字符串(simple_query_string)查询 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-dsl-query-string-query"></a>查询字符串(query_string)查询
</h2>
</div></div></div>

<p>
使用具有严格语法的解析器，根据提供的查询字符串返回文档。  
</p>
<p>
该查询使用一种<a class="xref" href="query-dsl-query-string-query.html#query-string-syntax" title="Query string syntax">语法</a>，根据运算符（如<code class="literal">AND</code> 或 <code class="literal">NOT</code>）来解析和拆分所给的查询字符串。

在返回匹配的文档之前，查询会单独<a class="xref" href="analysis.html" title="Text analysis">分析</a>每个拆分出的文本。
</p>
<p>
可以使用 <code class="literal">query_string</code> 查询创建包含通配符的复杂搜索、跨多个字段的搜索等等。

虽然该查询是通用的，但它却很严格，如果查询字符串包含任何无效语法，就会返回错误。 
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
因为它会因为任何无效的语法而返回错误，所以我们不建议对搜索框使用 <code class="literal">query_string</code> 查询。
</p>
<p>
如果不需要支持查询语法，可以考虑使用 <a class="xref" href="query-dsl-match-query.html" title="Match query"><code class="literal">match</code></a> 查询。

如果需要查询语法的特性，请使用 <a class="xref" href="query-dsl-simple-query-string-query.html" title="Simple query string query"><code class="literal">simple_query_string</code></a> 查询，它没有那么严格。
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="query-string-query-ex-request"></a>请求示例
</h3>
</div></div></div>
<p>
当执行下面的搜索时，<code class="literal">query_string</code> 查询将 <code class="literal">(new york city) OR (big apple)</code> 拆分成两个部分：<code class="literal">new york city</code> 和 <code class="literal">big apple</code>。

然后，在返回匹配的文档之前，<code class="literal">content</code> 字段的分析器单独将每个部分转换成词元(token)。

因为查询语法不使用空格作为运算符，所以 <code class="literal">new york city</code>按原样传递给分析器。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string" : {
            "query" : "(new york city) OR (big apple)",
            "default_field" : "content"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/151.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="query-string-top-level-params"></a><code class="literal">query_string</code>的顶级参数
</h3>
</div></div></div>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">query</code>
</span>
</dt>
<dd>
(必需的, string) 希望解析并用于搜索的查询字符串。参考<a class="xref" href="query-dsl-query-string-query.html#query-string-syntax" title="Query string syntax">查询字符串语法</a>。
</dd>
<dt>
<span class="term">
<code class="literal">default_field</code>
</span>
</dt>
<dd>
<p>(可选, string) 如果查询字符串中没有指定字段，你希望搜索的默认字段。</p>
<p>
默认为 <code class="literal">index.query.default_field</code> 索引设置，其默认值为<code class="literal">*</code>。

<code class="literal">*</code> 值提取符合条件查询的所有字段，并过滤元数据字段。

如果没有指定 <code class="literal">prefix</code>，则将所有提取出来的字段组合起来构建一个查询。
</p>
<p>
在所有符合要求的字段中搜索并不会包括 <a class="xref" href="nested.html" title="Nested datatype">嵌套文档</a>，请使用 <a class="xref" href="query-dsl-nested-query.html" title="Nested query"><code class="literal">nested</code>查询</a> 来搜索这些文档。
</p>
<div id="WARNING" class="exampleblock">
<div class="content">
<p>
对于包含大量字段的映射，在所有符合条件的字段中进行搜索的成本可能会非常高。
</p>
<p>
一次可以查询的字段数量是有限制的。

它由 <code class="literal">indices.query.bool.max_clause_count</code> <a class="xref" href="search-settings.html" title="Search settings">搜索设置</a>定义，默认为 1024。
</p>
</div>
</div>
</dd>
<dt>
<span class="term">
<code class="literal">allow_leading_wildcard</code>
</span>
</dt>
<dd>
(可选, boolean) 如果为 <code class="literal">true</code>，通配符<code class="literal">*</code> 和 <code class="literal">?</code>允许作为查询字符串的第一个字符。默认为 <code class="literal">true</code>。
</dd>
<dt>
<span class="term">
<code class="literal">analyze_wildcard</code>
</span>
</dt>
<dd>
(可选, boolean) 如果为 <code class="literal">true</code>，查询将尝试分析查询字符串中的通配符。默认为 <code class="literal">false</code>。
</dd>
<dt>
<span class="term">
<code class="literal">analyzer</code>
</span>
</dt>
<dd>
(可选, string) 用于将查询字符串中的文本转换为词元(token)的<a class="xref" href="analysis.html" title="Text analysis">分析器</a> 。

默认为字段 <code class="literal">default_field</code> 所映射的 <a class="xref" href="specify-analyzer.html#specify-index-time-analyzer" title="How Elasticsearch determines the index analyzer">索引时使用的分析器</a>。

如果没有映射分析器，则使用索引的默认分析器。
</dd>
<dt>
<span class="term">
<code class="literal">auto_generate_synonyms_phrase_query</code>
</span>
</dt>
<dd>
(可选, boolean) 如果为 <code class="literal">true</code>，将自动为多词项同义词创建 <a class="xref" href="query-dsl-match-query-phrase.html" title="Match phrase query">匹配短语(match phrase)</a> 查询。

默认为 <code class="literal">true</code>。

有关示例请参考 <a class="xref" href="query-dsl-query-string-query.html#query-string-synonyms" title="Synonyms and the query_string query">同义词和<code class="literal">query_string</code>查询</a>。
</dd>
<dt>
<span class="term">
<code class="literal">boost</code>
</span>
</dt>
<dd>
<p>(可选, float) 用于降低或增加查询的<a class="xref" href="query-filter-context.html#relevance-scores" title="Relevance scores">相关性评分</a>的浮点数。默认为 <code class="literal">1.0</code>。
</p>
<p>
boost 值是相对于默认值 <code class="literal">1.0</code> 的。

当它在 <code class="literal">0</code> 和 <code class="literal">1.0</code> 之间时会降低相关性评分，而大于 <code class="literal">1.0</code> 时会增加相关性评分。
</p>
</dd>
<dt>
<span class="term">
<code class="literal">default_operator</code>
</span>
</dt>
<dd>
<p>(可选, string) 未指定运算符时，用于解释查询字符串中的文本的默认的布尔逻辑。有效值有：
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">OR</code> (默认)
</span>
</dt>
<dd>
比如，查询字符串 <code class="literal">capital of Hungary</code> 被解释为 <code class="literal">capital OR of OR Hungary</code>。
</dd>
<dt>
<span class="term">
<code class="literal">AND</code>
</span>
</dt>
<dd>
比如，查询字符串 <code class="literal">capital of Hungary</code> 被解释为 <code class="literal">capital AND of AND Hungary</code>。
</dd>
</dl>
</div>
</dd>
<dt>
<span class="term">
<code class="literal">enable_position_increments</code>
</span>
</dt>
<dd>
(可选, boolean) 如果为 <code class="literal">true</code>，则在由<code class="literal">query_string</code>搜索构建的查询中启用位置增量。默认为 <code class="literal">true</code>。
</dd>
<dt>
<span class="term">
<code class="literal">fields</code>
</span>
</dt>
<dd>
<p>(可选, array of strings) 你想搜索的字段的数组。</p>
<p>可以使用此参数跨多个字段进行搜索。参考<a class="xref" href="query-dsl-query-string-query.html#query-string-multi-field" title="Search multiple fields">搜索多个字段</a>。</p>
</dd>
<dt>
<span class="term">
<code class="literal">fuzziness</code>
</span>
</dt>
<dd>
(可选, string) 匹配时的最大编辑距离。有效值及更多信息请参考 <a class="xref" href="common-options.html#fuzziness" title="Fuzziness">模糊性</a>。
</dd>
<dt>
<span class="term">
<code class="literal">fuzzy_max_expansions</code>
</span>
</dt>
<dd>
(可选, integer) 模糊匹配查询能扩展到的最大词项数。默认为<code class="literal">50</code>。
</dd>
<dt>
<span class="term">
<code class="literal">fuzzy_prefix_length</code>
</span>
</dt>
<dd>
(可选, integer) 模糊匹配的起始字符保持不变的字符数量。默认为 <code class="literal">0</code>。
</dd>
<dt>
<span class="term">
<code class="literal">fuzzy_transpositions</code>
</span>
</dt>
<dd>
(可选, boolean) 如果为<code class="literal">true</code>，模糊匹配的编辑可以包含两个相邻字符的交换(ab → ba)。默认为 <code class="literal">true</code>。
</dd>
<dt>
<span class="term">
<code class="literal">lenient</code>
</span>
</dt>
<dd>
(可选, boolean) 如果为 <code class="literal">true</code>，则忽略基于格式的错误，例如为 <a class="xref" href="number.html" title="Numeric datatypes">numeric</a> 字段提供 text 值。
默认为 <code class="literal">false</code>。
</dd>
<dt>
<span class="term">
<code class="literal">max_determinized_states</code>
</span>
</dt>
<dd>
<p>(可选, integer) 查询所需的<a href="https://en.wikipedia.org/wiki/Deterministic_finite_automaton" class="ulink" target="_top">自动机状态</a>的最大值。默认为<code class="literal">10000</code>。</p>
<p>
Elasticsearch 内部使用<a href="https://lucene.apache.org/core/" class="ulink" target="_top">Apache Lucene</a>解析正则表达式。

Lucene 将每个正则表达式转换成一个包含许多确定状态的有限自动机。
</p>
<p>可以使用此参数来防止该转换无意中消耗太多资源。你可能需要提高这个限制来运行复杂的正则表达式。</p>
</dd>
<dt>
<span class="term">
<code class="literal">minimum_should_match</code>
</span>
</dt>
<dd>
(可选, string) 要返回的文档必须匹配的最小子句数。

有效值及更多信息请参考 <a class="xref" href="query-dsl-minimum-should-match.html" title="minimum_should_match parameter"><code class="literal">minimum_should_match</code>参数</a>。

查看<a class="xref" href="query-dsl-query-string-query.html#query-string-min-should-match" title="How minimum_should_match works"><code class="literal">minimum_should_match</code>如何工作</a>的示例。
</dd>
<dt>
<span class="term">
<code class="literal">quote_analyzer</code>
</span>
</dt>
<dd>
<p>(可选, string) 用于将查询字符串中的引用文本转换为词元(token)的<a class="xref" href="analysis.html" title="Text analysis">分析器</a>。

默认为字段 <code class="literal">default_field</code> 映射的 <a class="xref" href="analyzer.html#search-quote-analyzer" title="search_quote_analyzer"><code class="literal">search_quote_analyzer</code></a>。
</p>
<p>对于引用的文本，此参数会覆盖 <code class="literal">analyzer</code> 参数中指定的分析器。</p>
</dd>
<dt>
<span class="term">
<code class="literal">phrase_slop</code>
</span>
</dt>
<dd>
(可选, integer) 短语的匹配词元之间允许的最大位置数。默认为 <code class="literal">0</code>。

如果为 <code class="literal">0</code>，则要求精确的短语匹配。

颠倒顺序的词项的 slop 的值为 <code class="literal">2</code>。
</dd>
<dt>
<span class="term">
<code class="literal">quote_field_suffix</code>
</span>
</dt>
<dd>
<p>(可选, string) 查询字符串中附加到引用文本的后缀。</p>
<p>可以使用此后缀来使用不同的分析方法进行精确匹配。参考 <a class="xref" href="mixing-exact-search-with-stemming.html" title="Mixing exact search with stemming">将精确搜索与词干混合</a>。</p>
</dd>
<dt>
<span class="term">
<code class="literal">rewrite</code>
</span>
</dt>
<dd>
(可选, string) 用于重写查询的方法。有效值及更多信息请参考<a class="xref" href="query-dsl-multi-term-rewrite.html" title="rewrite parameter"><code class="literal">rewrite</code>参数</a>。
</dd>
<dt>
<span class="term">
<code class="literal">time_zone</code>
</span>
</dt>
<dd>
<p>(可选, string) <a href="https://en.wikipedia.org/wiki/List_of_UTC_time_offsets" class="ulink" target="_top" rel="nofollow">协调世界时(UTC)时差</a>或 <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" class="ulink" target="_top" rel="nofollow">IANA时区</a>，用于将查询字符串中的 <code class="literal">date</code> 值转换为 UTC。
</p>
<p>
有效值包括 ISO 8601 UTC 时差，如 <code class="literal">+01:00</code> 或 <code class="literal">-08:00</code>，以及 IANA 时区识别名称，如 <code class="literal">America/Los_Angeles</code>。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<code class="literal">time_zone</code> 参数<span class="strong strong"><strong>不</strong></span>影响 <code class="literal">now</code> 的 <a class="xref" href="common-options.html#date-math" title="Date Math" rel="nofollow">日期计算</a>值。

<code class="literal">now</code> 始终是 UTC 中的当前系统时间。

但是，<code class="literal">time_zone</code> 参数会对使用<code class="literal">now</code> 和 <a class="xref" href="common-options.html#date-math" title="Date Math" rel="nofollow">日期计算舍入</a> 计算的日期进行转换。

例如，<code class="literal">time_zone</code> 参数会将 <code class="literal">now/d</code> 的值进行转换。
</p>
</div>
</div>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="query-string-query-notes"></a>注意事项
</h3>
</div></div></div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="query-string-syntax"></a>查询字符串语法
</h4>
</div></div></div>
<p>查询字符串“迷你语言”由 <a class="xref" href="search-search.html" title="Search API"><code class="literal">search</code> API</a>中的 <a class="xref" href="query-dsl-query-string-query.html" title="Query string query">查询字符串</a>和 <code class="literal">q</code> 查询字符串参数使用。</p>
<p>
查询字符串被解析为一系列<em>词项(term)</em>和<em>运算符(operator)</em>。

词项(term)可以是一个单词(如<code class="literal">quick</code> 或 <code class="literal">brown</code>)，也可以是一个用双引号括起来的短语(如<code class="literal">"quick brown"</code>) - 它以相同的顺序搜索短语中的所有单词。
</p>
<p>运算符允许你自定义搜索—可用选项如下所述。</p>
<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_field_names"></a>字段名称(field names)
</h5>
</div></div></div>
<p>可以在查询语法中指定要搜索的字段，下面是几个例子：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p><code class="literal">status</code>字段中包含单词<code class="literal">active</code>：</p>
<pre class="literallayout">status:active</pre>

</li>
<li class="listitem">
<p><code class="literal">title</code> 字段中包含单词 <code class="literal">quick</code> 或 <code class="literal">brown</code>：</p>
<pre class="literallayout">title:(quick OR brown)</pre>

</li>
<li class="listitem">
<p><code class="literal">author</code> 字段中包含精确匹配的短语<code class="literal">"john smith"</code>：</p>
<pre class="literallayout">author:"John Smith"</pre>

</li>
<li class="listitem">
<p><code class="literal">first name</code> 字段包含 <code class="literal">Alice</code> (注意，我们需要用反斜杠转义字段名称中的空格)：</p>
<pre class="literallayout">first\ name:Alice</pre>

</li>
<li class="listitem">
<p><code class="literal">book.title</code>、<code class="literal">book.content</code> 或 <code class="literal">book.date</code> 任意一个字段中包含单词 <code class="literal">quick</code> 或 <code class="literal">brown</code> (注意，我们需要用反斜杠转义字段名称中的<code class="literal">*</code>)：</p>
<pre class="literallayout">book.\*:(quick OR brown)</pre>

</li>
<li class="listitem">
<p>字段<code class="literal">title</code>有任何非null的值(只要存在这个字段,即使其值是空字符串)：</p>
<pre class="literallayout">_exists_:title</pre>

</li>
</ul>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="query-string-wildcard"></a>通配符
</h5>
</div></div></div>
<p>通配符搜索可以在单个词项上运行，使用 <code class="literal">?</code> 替换单个字符，使用 <code class="literal">*</code> 替换零个或多个字符：</p>
<pre class="literallayout">qu?ck bro*</pre>

<p>请注意，通配符查询会占用大量内存，并且性能非常差——只要想想需要查询多少个词项才能匹配查询字符串 <code class="literal">"a* b* c*"</code>。</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
为了提高效率，纯通配符 <code class="literal">\*</code> 被重写为 <a class="xref" href="query-dsl-exists-query.html" title="Exists query"><code class="literal">exists</code></a> 查询。

因此，通配符 <code class="literal">"field:*"</code> 将匹配具有空值的文档，如下所示：
</p>
<pre class="screen">{
  "field": ""
}</pre>
<p>
... 如果字段缺失或设置了显式的 null 值，则 <span class="strong strong"><strong>不</strong></span> 匹配，如下所示：
</p>
<pre class="screen">{
  "field": null
}</pre>
</div>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
允许在单词的开头使用通配符(例如<code class="literal">"*ing"</code>)的资源消耗特别大，因为需要检查索引中的所有词项，以防它们匹配。

通过将 <code class="literal">allow_leading_wildcard</code>设置为 <code class="literal">false</code>，可以禁用前置通配符。
</p>
</div>
</div>
<p>
只有部分分析链应用在字符级别的操作上。

例如，如果分析器既执行转小写又执行词干分析(提取)，那么只会应用转小写操作：对一个缺少某些字母的单词执行词干分析是错误的。
</p>
<p>
通过将 <code class="literal">analyze_wildcard</code> 设置为true，将分析以 <code class="literal">*</code> 结尾的查询，通过确保前 N-1 个词元(token)的精确匹配和最后一个词元的前缀匹配，从不同的词元中构建 bool 查询。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_regular_expressions"></a>正则表达式
</h5>
</div></div></div>
<p>通过将正则表达式模式用斜杠(<code class="literal">"/"</code>)包裹，可以将它们嵌入到查询字符串中：</p>
<pre class="literallayout">name:/joh?n(ath[oa]n)/</pre>

<p><a class="xref" href="regexp-syntax.html" title="Regular expression syntax"><em>正则表达式语法</em></a> 中解释了支持的正则表达式语法。</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<code class="literal">allow_leading_wildcard</code> 参数对正则表达式没有任何控制。

下面这个查询字符串将强制 Elasticsearch 访问索引中的每个词项:
</p>
<pre class="literallayout">/.*n/</pre>

<p>慎用！</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="query-string-fuzziness"></a>模糊性(Fuzziness)
</h5>
</div></div></div>
<p>
我们可以使用“模糊”运算符搜索与我们的搜索词项相似但又不完全相似的词项：
</p>
<pre class="literallayout">quikc~ brwn~ foks~</pre>

<p>
它使用 <a href="http://en.wikipedia.org/wiki/Damerau-Levenshtein_distance" class="ulink" target="_top">达梅劳-莱温斯坦距离</a> 来查找最多有两个变化的所有词项，其变化包括单个字符的插入、删除或替换，或者两个相邻字符的位置调换。
</p>
<p>
默认的<em>编辑距离</em>是<code class="literal">2</code>，但是编辑距离<code class="literal">1</code>应该足以捕捉 80% 的人类拼写错误。
它可以指定为：
</p>
<pre class="literallayout">quikc~1</pre>

<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<h3>避免混合使用模糊性和通配符<a id="avoid-widlcards-fuzzy-searches"></a>
</h3>
<p>
<em>不</em>支持混合使用 <a class="xref" href="common-options.html#fuzziness" title="Fuzziness">模糊</a> 和 <a class="xref" href="query-dsl-query-string-query.html#query-string-wildcard" title="Wildcards">通配符</a> 运算符。

混合使用时，其中一个运算符不会被应用。

例如，可以搜索<code class="literal">app~1</code>(模糊)或<code class="literal">app*</code>(通配符)，但搜索<code class="literal">app*~1</code>时不会应用模糊运算符(<code class="literal">~1</code>)。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_proximity_searches"></a>邻近搜索 (proximity searches)
</h5>
</div></div></div>
<p>
虽然短语查询（例如<code class="literal">"john smith"</code>）希望所有词项的顺序完全相同，但 邻近查询(proximity query) 允许指定的词语相距更远或顺序不同。

与 模糊查询(fuzzy query) 可以指定单词中字符的最大编辑距离相同，邻近搜索允许我们指定短语中单词的最大编辑距离:
</p>
<pre class="literallayout">"fox quick"~5</pre>

<p>
字段中的文本越接近查询字符串中指定的原始顺序，该文档就被认为越相关。

与上面的示例查询相比，短语 <code class="literal">"quick fox"</code> 被认为比 <code class="literal">"quick brown fox"</code> 更相关。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_ranges"></a>范围 (ranges)
</h5>
</div></div></div>
<p>
可以为 date、numeric 或 string 字段指定范围。

包含范围用方括号<code class="literal">[min TO max]</code>表示，不包含范围用花括号<code class="literal">{min TO max}</code>表示。
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>2012年内的所有天数：</p>
<pre class="literallayout">date:[2012-01-01 TO 2012-12-31]</pre>

</li>
<li class="listitem">
<p>数字 1 到 5：</p>
<pre class="literallayout">count:[1 TO 5]</pre>

</li>
<li class="listitem">
<p>介于 <code class="literal">alpha</code> 和 <code class="literal">omega</code> 之间的标签，但不包含 <code class="literal">alpha</code> 和 <code class="literal">omega</code>：</p>
<pre class="literallayout">tag:{alpha TO omega}</pre>

</li>
<li class="listitem">
<p>10以上的数字：</p>
<pre class="literallayout">count:[10 TO *]</pre>

</li>
<li class="listitem">
<p>2012年之前的日期：</p>
<pre class="literallayout">date:{* TO 2012-01-01}</pre>

</li>
</ul>
</div>
<p>大括号和方括号可以组合使用：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<p>从 1 到 5 的数字，但不包括 5：</p>
<pre class="literallayout">count:[1 TO 5}</pre>

</li>
</ul>
</div>
<p>一侧无界的范围可以使用以下语法：</p>
<pre class="literallayout">age:&gt;10
age:&gt;=10
age:&lt;10
age:&lt;=10</pre>

<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
要使用简化的语法组合上限和下限，需要用 <code class="literal">AND</code> 运算符连接两个子句:
</p>
<pre class="literallayout">age:(&gt;=10 AND &lt;20)
age:(+&gt;=10 +&lt;20)</pre>

</div>
</div>
<p>
查询字符串中范围的解析可能很复杂并且容易出错。

使用显式的 <a class="xref" href="query-dsl-range-query.html" title="Range query"><code class="literal">range</code> 查询</a> 要可靠得多。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_boosting"></a>增强 (boosting)
</h5>
</div></div></div>
<p>
使用<em>增强(boost)</em>运算符 <code class="literal">^</code> 使一个词项比另一个更相关。

例如，如果我们想找到所有关于 <code class="literal">fox</code> 的文档，但是我们对 <code class="literal">quick fox</code> 特别感兴趣：
</p>
<pre class="literallayout">quick^2 fox</pre>

<p>
默认 <code class="literal">boost</code> 的值为 1，但可以是任何正浮点数。

<code class="literal">boost</code>的值在 0 到 1 之间时会降低相关性。
</p>
<p><code class="literal">boost</code>也可用于短语或分组：</p>
<pre class="literallayout">"john smith"^2   (foo bar)^4</pre>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_boolean_operators"></a>布尔运算符 (boolean operators)
</h5>
</div></div></div>
<p>
默认情况下，所有词项都是可选的，只要有一个词项匹配即可。

搜索 <code class="literal">foo bar baz</code> 将找到包含 <code class="literal">foo</code>、<code class="literal">bar</code>、<code class="literal">baz</code> 中的一个或多个的任何文档。

我们在上面已经讨论了 <code class="literal">default_operator</code>，它允许你强制所有的词项都是必需的，但是也有一些<em>布尔运算符</em>可以在查询字符串本身中使用，以提供更多的控制。
</p>
<p>
首选运算符是 <code class="literal">+</code> (该词项<span class="strong strong"><strong>必须</strong></span>存在) 和 <code class="literal">-</code> (该词项 <span class="strong strong"><strong>必须不</strong></span> 存在)。所有其他词项都是可选的。
例如，下面这个查询：
</p>
<pre class="literallayout">quick brown +fox -news</pre>

<p>说明：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">fox</code> 必须存在
</li>
<li class="listitem">
<code class="literal">news</code> 必须不存在
</li>
<li class="listitem">
<code class="literal">quick</code> 和 <code class="literal">brown</code> 是可选的，但如果他们存在则会增加相关性
</li>
</ul>
</div>
<p>
我们所熟悉的布尔运算符<code class="literal">AND</code>、<code class="literal">OR</code> 和 <code class="literal">NOT</code>（也写成 <code class="literal">&amp;&amp;</code>、<code class="literal">||</code> 和 <code class="literal">!</code>）也是受支持的，但要注意它们不遵守通常的优先规则，所以当多个运算符一起使用时，应该使用括号。

例如，前面的查询(即: quick brown +fox -news)可以重写为：
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">((quick AND fox) OR (brown AND fox) OR fox) AND NOT news</code>
</span>
</dt>
<dd>
这种形式现在正确地复制了原查询的逻辑，但是相关性评分与原查询几乎没有相似之处。
</dd>
</dl>
</div>
<p>
相比之下，使用 <a class="xref" href="query-dsl-match-query.html" title="Match query"><code class="literal">match</code>查询</a> 重写的相同查询会像这样：
</p>
<pre class="literallayout">{
    "bool": {
        "must":     { "match": "fox"         },
        "should":   { "match": "quick brown" },
        "must_not": { "match": "news"        }
    }
}</pre>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_grouping"></a>分组 (grouping)
</h5>
</div></div></div>
<p>多个词项或子句可以用括号组合在一起，形成子查询：</p>
<pre class="literallayout">(quick OR brown) AND fox</pre>

<p>组可用于针对特定字段，或增强子查询的结果：</p>
<pre class="literallayout">status:(active OR pending) title:(full text search)^2</pre>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_reserved_characters"></a>保留字符
</h5>
</div></div></div>
<p>
如果你需要在查询本身中使用任何起运算符作用的字符(而不是运算符)，那么你应该在前面加一个反斜杠对它们进行转义。

例如，要搜索 <code class="literal">(1+1)=2</code>，你需要将查询写成 <code class="literal">\(1\+1\)\=2</code>。

当请求体使用 JSON 时，前面需要两个反斜杠(<code class="literal">\\</code>)；反斜杠是 JSON 字符串中保留的转义字符。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /twitter/_search
{
  "query" : {
    "query_string" : {
      "query" : "kimchy\\!",
      "fields"  : ["user"]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/152.console"></div>
<p>保留字符有：<code class="literal">+ - = &amp;&amp; || &gt; &lt; ! ( ) { } [ ] ^ " ~ * ? : \ /</code></p>
<p>未能正确转义这些特殊字符可能会导致语法错误，从而使查询无法运行。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<code class="literal">&lt;</code> 和 <code class="literal">&gt;</code> 根本不能进行转义。

防止他们试图创建范围查询的唯一方法是将他们从查询字符串中完全删除。
</p>
</div>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="_whitespaces_and_empty_queries"></a>空格和空查询 (whitespaces and empty queries)
</h5>
</div></div></div>
<p>空格(whitespace)不被当做运算符。</p>
<p>如果查询字符串为空或者只包含空格，查询将产生一个空的结果集。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="query-string-nested"></a>避免对嵌套文档使用 <code class="literal">query_string</code> 查询
</h5>
</div></div></div>
<p><code class="literal">query_string</code> 搜索不会返回 <a class="xref" href="nested.html" title="Nested datatype">嵌套的(nested)</a> 文档。

要搜索嵌套文档，请使用 <a class="xref" href="query-dsl-nested-query.html" title="Nested query"><code class="literal">nested</code> 查询</a>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="query-string-multi-field"></a>搜索多个字段
</h5>
</div></div></div>
<p>可以使用 <code class="literal">fields</code> 参数同时对多个字段执行 <code class="literal">query_string</code> 搜索。</p>
<p>
对多个字段运行 <code class="literal">query_string</code> 查询的想法是将每个查询词项扩展为一个 OR 子句，如下所示：</p>
<pre class="screen">field1:query_term OR field2:query_term | ...</pre>
<p>例如，这个查询</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name"],
            "query" : "this AND that"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/153.console"></div>
<p>与下面这个查询匹配相同的词：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string": {
            "query": "(content:this OR name:this) AND (content:that OR name:that)"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/154.console"></div>
<p>
由于几个查询是从单个搜索词项中生成的，所以使用带有 <code class="literal">tie_breaker</code> 的 <code class="literal">dis_max</code> 查询自动完成对它们的组合。

例如(使用符号 <code class="literal">^5</code> 将 <code class="literal">name</code> 增加 5)：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name^5"],
            "query" : "this AND that OR thus",
            "tie_breaker" : 0
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/155.console"></div>
<p>
简单通配符也可以用于“在”文档指定的内部元素中搜索。

例如，如果有一个包含多个字段的 <code class="literal">city</code> 对象(或包含几个字段的内部对象)，则可以自动搜索所有"city"字段：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["city.*"],
            "query" : "this AND that OR thus"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/156.console"></div>
<p>另一个选项是在查询字符串本身中提供通配符字段搜索(正确转义 <code class="literal">*</code> 标志)，例如：<code class="literal">city.\*:something</code>：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string" : {
            "query" : "city.\\*:(this AND that OR thus)"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/157.console"></div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>由于 <code class="literal">\</code> (反斜杠)是 json 字符串中的一个特殊字符，因此需要转义，因此在上面的 <code class="literal">query_string</code>中有两个反斜杠。</p>
</div>
</div>
<p>fields 参数还可以包括基于模式的字段名，允许自动展开到相关字段(包括动态引入的字段)。例如：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name.*^5"],
            "query" : "this AND that OR thus"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/158.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h5 class="title">
<a id="query-string-multi-field-parms"></a>多字段搜索的附加参数
</h5>
</div></div></div>
<p>当对多个字段运行 <code class="literal">query_string</code> 查询时，支持下列附加参数。</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">type</code>
</span>
</dt>
<dd>
<p>(可选, string) 确定查询如何对文档进行匹配和评分。有效值有：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">best_fields</code> (默认)
</span>
</dt>
<dd>
查找与任何字段匹配的文档，并使用任何匹配字段中的最高的 <a class="xref" href="query-filter-context.html#relevance-scores" title="Relevance scores"><code class="literal">_score</code></a>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-best-fields" title="best_fields"><code class="literal">best_fields</code></a>。
</dd>
<dt>
<span class="term">
<code class="literal">bool_prefix</code>
</span>
</dt>
<dd>
在每个字段上创建 <code class="literal">match_bool_prefix</code> 查询，并组合每个字段的 <code class="literal">_score</code>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-bool-prefix" title="bool_prefix"><code class="literal">bool_prefix</code></a>。
</dd>
<dt>
<span class="term">
<code class="literal">cross_fields</code>
</span>
</dt>
<dd>
用相同的 <code class="literal">analyzer</code> 处理字段，就好像它们是一个大字段。

在 <span class="strong strong"><strong>任何</strong></span> 字段中查找每个单词。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-cross-fields" title="cross_fields"><code class="literal">cross_fields</code></a>。
</dd>
<dt>
<span class="term">
<code class="literal">most_fields</code>
</span>
</dt>
<dd>
查找与任何字段匹配的文档，并合并每个字段的 <code class="literal">_score</code>。参见 <a class="xref" href="query-dsl-multi-match-query.html#type-most-fields" title="most_fields"><code class="literal">most_fields</code></a>。
</dd>
<dt>
<span class="term">
<code class="literal">phrase</code>
</span>
</dt>
<dd>
See <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> and <code class="literal">phrase_prefix</code></a>.

对每个字段运行 <code class="literal">match_phrase</code> 查询，并使用最佳字段(best field)的 <code class="literal">_score</code>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code></a>。
</dd>
<dt>
<span class="term">
<code class="literal">phrase_prefix</code>
</span>
</dt>
<dd>
对每个字段运行 <code class="literal">match_phrase_prefix</code> 查询，并使用最佳字段(best field)的 <code class="literal">_score</code>。

参见 <a class="xref" href="query-dsl-multi-match-query.html#type-phrase" title="phrase and phrase_prefix"><code class="literal">phrase</code> 和 <code class="literal">phrase_prefix</code></a>。
</dd>
</dl>
</div>
<p>注意：根据 <a class="xref" href="query-dsl-multi-match-query.html#multi-match-types" title="Types of multi_match query:"><code class="literal">type</code></a> 的值，<code class="literal">multi_match</code> 可能有额外的顶级参数。</p>
</dd>
</dl>
</div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="query-string-synonyms"></a>同义词与<code class="literal">query_string</code>查询
</h4>
</div></div></div>
<p>
<code class="literal">query_string</code> 查询支持 <a class="xref" href="analysis-synonym-graph-tokenfilter.html" title="Synonym graph token filter">synonym_graph</a> 词元过滤器(token filter)的多词项同义词扩展。

当使用该过滤器时，解析器将为每个多词项同义词创建一个短语查询。

例如，同义词 <code class="literal">ny, new york</code> 将产生：
</p>
<p><code class="literal">(ny OR ("new york"))</code></p>
<p>还可以用"逻辑与"匹配多个词项同义词代替：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
   "query": {
       "query_string" : {
           "default_field": "title",
           "query" : "ny city",
           "auto_generate_synonyms_phrase_query" : false
       }
   }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/159.console"></div>
<p>上面的示例创建了一个bool查询：</p>
<p><code class="literal">(ny OR (new AND york)) city</code></p>
<p>
它将文档与词项 <code class="literal">ny</code> 或 逻辑与<code class="literal">new AND york</code> 相匹配。

默认情况下，参数 <code class="literal">auto_generate_synonyms_phrase_query</code> 设置为 <code class="literal">true</code>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="query-string-min-should-match"></a><code class="literal">minimum_should_match</code> 是如何工作的
</h4>
</div></div></div>
<p>
<code class="literal">query_string</code> 根据每个运算符拆分查询，从而为整个输入创建布尔查询。

可以使用<code class="literal">minimum_should_match</code>来控制结果查询中应该匹配的“should”子句的数量。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string": {
            "fields": [
                "title"
            ],
            "query": "this that thus",
            "minimum_should_match": 2
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/160.console"></div>
<p>上面的例子创建了一个bool查询：</p>
<p><code class="literal">(title:this title:that title:thus)~2</code></p>
<p>它将返回单个字段<code class="literal">title</code>与至少<code class="literal">this</code>、<code class="literal">that</code> 或 <code class="literal">thus</code> 中的2个词项匹配的文档。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="query-string-min-should-match-multi"></a><code class="literal">minimum_should_match</code> 如何处理多个字段的匹配
</h4>
</div></div></div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string": {
            "fields": [
                "title",
                "content"
            ],
            "query": "this that thus",
            "minimum_should_match": 2
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/161.console"></div>
<p>上面的例子创建了一个bool查询：</p>
<p><code class="literal">((content:this content:that content:thus) | (title:this title:that title:thus))</code></p>
<p>
它使用"逻辑或"最大限度的通过<code class="literal">title</code>和<code class="literal">content</code>字段去匹配文档。

这里无法应用<code class="literal">minimum_should_match</code>参数。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string": {
            "fields": [
                "title",
                "content"
            ],
            "query": "this OR that OR thus",
            "minimum_should_match": 2
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/162.console"></div>
<p>添加显式运算符(<code class="literal">OR</code>)强制每个词项被视为一个单独的子句。</p>
<p>上面的例子创建了一个bool查询：</p>
<p><code class="literal">((content:this | title:this) (content:that | title:that) (content:thus | title:thus))~2</code></p>
<p>这使文档至少与三个“should”子句中的两个匹配，每个子句都是由每个词项的字段上的最大"逻辑或"构成的。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="query-string-min-should-match-cross"></a><code class="literal">minimum_should_match</code> 如何处理跨字段搜索
</h4>
</div></div></div>
<p>字段<code class="literal">type</code>的值为<code class="literal">cross_fields</code>时，对在分析输入时使用了相同分析器的字段进行分组。</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
    "query": {
        "query_string": {
            "fields": [
                "title",
                "content"
            ],
            "query": "this OR that OR thus",
            "type": "cross_fields",
            "minimum_should_match": 2
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/163.console"></div>
<p>上面的例子创建了一个bool查询：</p>
<p><code class="literal">(blended(terms:[field2:this, field1:this]) blended(terms:[field2:that, field1:that]) blended(terms:[field2:thus, field1:thus]))~2</code></p>
<p>这将匹配与三个词项混合(blended)查询中的至少两个匹配的文档。</p>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_notes"></a>注意
</h3>
</div></div></div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_allow_expensive_queries"></a>允许执行昂贵的查询
</h4>
</div></div></div>
<p>
查询字符串查询可以在内部转换为<a class="xref" href="query-dsl-prefix-query.html" title="Prefix query"><code class="literal">prefix查询</code></a>，这意味着如果如<a class="xref" href="query-dsl-prefix-query.html#prefix-query-allow-expensive-queries" title="Allow expensive queries">这里</a>所解释的那样禁用前缀查询，则查询字符串查询将不会被执行并抛出异常。</p>
</div>

</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl-common-terms-query.html">« 常用(common)词项查询</a>
</span>
<span class="next">
<a href="query-dsl-simple-query-string-query.html">简单查询字符串(simple_query_string)查询 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>